package Offer11;

import java.util.Arrays;

/**
 * 旋转数组的最小数字
 * 把一个数组最开始的若干个元素搬到数组的末尾，我们称之为数组的旋转。输入一个递增排序的数组的一个旋转，输出旋转数组的最小元素。
 * 例如，数组[3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转，该数组的最小值为1。
 * @author 23737
 * @time 2021.10.17
 */
public class Test {
    public static void main(String[] args) {
        int[] a = new int[]{3,4,5,1,2};
        System.out.println(new Solution().minArray(a));
        System.out.println(new SolutionTwo().minArray(a));
        System.out.println(new SolutionThree().minArray(a));
    }
}

/**
 * API Boy 哈哈哈
 * 但是肯定不是让你这么做的
 */
class Solution {
    public int minArray(int[] numbers) {
        Arrays.sort(numbers);
        return numbers[0];
    }
}

/**
 * 常规解法 我觉得变得更复杂了而已
 */
class SolutionTwo {
    public int minArray(int[] numbers) {
        int[] ReversionArray = new int[numbers.length+1];
        for (int i = 0; i < numbers.length; i++) {
            ReversionArray[numbers.length - i] = numbers[i];
        }
        int min = ReversionArray[1];
        for (int i = 1; i <= numbers.length; i++) {
            if (ReversionArray[i] < min) {
                min = ReversionArray[i];
            }
        }
        return min;
    }
}

/**
 * stream流一行代码  低效
 */
class SolutionThree {
    public int minArray(int[] numbers) {
        return Arrays.stream(numbers).min().getAsInt();
    }
}

/**
 * 二分查找y y d s
 */
class SolutionFour{
    public int minArray(int[] numbers) {
        int i = 0, j = numbers.length - 1;
        while (i < j) {
            int m = (i + j) / 2;
            if (numbers[m] > numbers[j]) i = m + 1;
            else if (numbers[m] < numbers[j]) j = m;
            else j--;
        }
        return numbers[i];
    }
}

